package cn.bytengine.stem.contexts;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 包含父级上下文的上下文。对于父级数据作只读操作。
 */
public class SpaceContext extends InternalCoreContext {
    private Context parent;

    public SpaceContext(Context parent) {
        this(parent, new ConcurrentHashMap<>());
    }

    public SpaceContext(Context parent, Map<String, Object> data) {
        super(data);
        this.parent = parent;
    }

    /**
     * 获取上下文指定key数据，如果当前上下文没有key，将从父级上下文获取。
     *
     * @param key 上下文数据key
     * @return 上下文对应key的数据
     */
    @Override
    public Object get(String key) {
        Object t = super.get(key);
        if (t == null && this.parent != null) {
            t = this.parent.get(key);
        }
        return t;
    }

    /**
     * 判断指定key是否存在上下文中，如果当前上下文没有，将从父级上下文寻找。
     *
     * @param key 上下文对应数据的key
     * @return 是否包含指定的key
     */
    @Override
    public boolean has(String key) {
        boolean t = super.has(key);
        if (!t && this.parent != null) {
            t = this.parent.has(key);
        }
        return t;
    }

    /**
     * 获取父级上下文
     *
     * @return 父级上下文实例
     */
    @Override
    public Context parent() {
        return this.parent;
    }

    /**
     * 是否包含父级上下文，该方法应该始终返回true。
     *
     * @return 如果有父级上下文，返回true。否则反之。
     */
    @Override
    public boolean hasParent() {
        return this.parent != null;
    }

    /**
     * 设置上级上下文
     *
     * @param parent 变更的父级上下文
     * @return 当前上下文对象
     */
    protected SpaceContext setParent(Context parent) {
        this.parent = parent;
        return this;
    }
}
